#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int c[N];
struct segment_tree{
    int ls[N*20];
    int rs[N*20];
    int mac[N*20];
    int pcnt;
    long long mas[N*20];
    void push_up(int now)
    {
        if(mac[ls[now]] == mac[rs[now]]){
            mac[now] = mac[ls[now]];
            mas[now] = mas[ls[now]] + mas[rs[now]];
        }else if(mac[ls[now]] > mac[rs[now]]){
            mac[now] = mac[ls[now]];
            mas[now] = mas[ls[now]];
        }else{
            mac[now] = mac[rs[now]];
            mas[now] = mas[rs[now]];
        }
    }
    void update(int &now,int l,int r,int p){
        if(!now){
            now = ++pcnt;
        }
        if(l == r){
            mac[now]++;
            mas[now] = p;
            return;
        }
        int mid = (l + r)/2;
        if(p <= mid){
            update(ls[now],l,mid,p);
        }else{
            update(rs[now],mid+1,r,p);
        }
        push_up(now);
    }
    int merge(int a,int b,int l,int r){
        if(!a || !b){
            return a + b;
        }
        if(l == r){
            mac[a] += mac[b];
            mas[a] = l;
            return a;
        }
        int mid = (l + r)/2;
        int now = a;
        ls[now] = merge(ls[a],ls[b],l,mid);
        rs[now] = merge(rs[a],rs[b],mid+1,r);
        push_up(now);
        return now;
    }
}sg;
vector<int> bian[N];
int n;
int rot[N];
long long ans[N];
void dfs(int x,int fa){
    for(int v: bian[x]){ 
        if(v == fa){
            continue;
        }
        dfs(v,x);
        rot[x] = sg.merge(rot[x],rot[v],1,n);
    }
    sg.update(rot[x],1,n,c[x]);
    ans[x] = sg.mas[rot[x]];
}
int main(){
    cin>>n;
    for(int i = 1;i<=n;i++){
        cin>>c[i];
    }
    for(int i = 1;i < n;i++){
        int x,y;
        cin>>x>>y;
        bian[x].push_back(y);
        bian[y].push_back(x);
    }
    dfs(1,0);
    for(int i = 1;i <=n;i++){
        cout<<ans[i]<<' ';
    }
    cout<<'\n';
}